package com.lixinyue.p2.util;

import java.util.*;
/**
 * CMutility工具类：
 * 将不同的功能封装为方法，直接通过调用的方法使用它的功能，无需考虑其调用的细节
 *
 */
public class CMUtility {

    private static Scanner scanner = new Scanner(System.in);
    /**
     *
     * @Description   	用于界面菜单的选择。该方法读取键盘，如果用户键入’1’-’5’中的任意字符
     * 					则方法返回。返回值为用户键入字符。
     * @author Bofu
     * @Date 2019年8月9日下午3:58:42
     * @return
     */
    public static char readMenuSelection(){

        char c;
        for(;;){
            String str = readKeyBoard(1,false);
            c = str.charAt(0);
            if(c !='1' && c != '2' &&
                    c!= '3' && c !='4' && c != '5'	){
                System.out.println("选择错误，请重新输入：");
            }else break;
        }

        return c;


    }
    /**
     *
     * @Description   从键盘上读取一个字符，并将其作为方法的返回值
     * @author Bofu
     * @Date 2019年8月9日下午4:01:35
     * @param limit
     * @param blankReturn
     * @return
     */
    public static char readChar(){
        String str = readKeyBoard(1,false);
        return str.charAt(0);
    }

    /**
     *
     * @Description	从键盘读取一个字符，并将其作为方法的返回值。
    如果用户不输入字符而直接回车，方法将以defaultValue 作为返回值。
     * @author Bofu
     * @Date 2019年8月9日下午4:05:53
     * @param limit
     * @param blankReturn
     * @return
     */

    public static char readChar(char defaultValue){
        String str = readKeyBoard(1,true);
        return (str.length() == 0)? defaultValue : str.charAt(0);
    }
    /**
     *
     * @Description   从键盘上读取一个不超过2位的整数，并将其作为方法的返回值。
     * @author Bofu
     * @Date 2019年8月9日下午4:08:42
     * @param limit
     * @param blankReturn
     * @return
     */
    public static int readInt(){
        int n;
        for(;;){
            String str = readKeyBoard(2,false);
            try{
                n = Integer.parseInt(str);
                break;
            }catch (NumberFormatException e) {
                System.out.println("数字输入错误，请重新输入");
            }
        }
        return n;
    }
    /**
     *
     * @Description   从键盘读取一个长度不超过2位的整数，并将其作为方法的返回值。
    如果用户不输入字符而直接回车，方法将以defaultValue 作为返回值。
     * @author Bofu
     * @Date 2019年8月9日下午4:12:34
     * @param limit
     * @param blankReturn
     * @return
     */
    public static int readInt(int defaultValue){
        int n;
        for(;;){
            String str = readKeyBoard(2,true);
            if (str.equals("")){
                return defaultValue;
            }
            try{
                n = Integer.parseInt(str);
                break;
            }catch (NumberFormatException e){
                System.out.println("数字输入错误，请重新输入");
            }
        }
        return n;
    }
    /**
     * 从键盘读取一个长度不超过limit的字符串，并将其作为方法的返回值。
     *
     */
    public static String readString(int limit){
        return readKeyBoard(limit, false);
    }
    /**
     * 从键盘读取一个长度不超过limit的字符串，并将其作为方法的返回值。
     * 如果用户不输入字符而直接回车，方法将以defaultValue 作为返回值。
     */
    public static String readString(int limit, String defaultValue){
        String str = readKeyBoard(limit,true);
        return str.equals("") ? defaultValue : str;
    }
    /**
     *
     * @Description  用于确认选择的输入。该方法从键盘读取‘Y’或’N’，并将其作为方法的返回值
     * @author Bofu
     * @Date 2019年8月9日下午4:20:46
     * @param limit
     * @param blankReturn
     * @return
     */
    public static char readConfirmSelection(){
        char c;
        for(;;){
            String str = readKeyBoard(1,false).toUpperCase();
            c = str.charAt(0);
            if(c == 'Y' || c == 'N'){
                break;
            }else{
                System.out.println("选择错误，请重新输入：");
            }
        }
        return c;
    }




    private static String readKeyBoard(int limit,boolean blankReturn){
        String line = "";

        while(scanner.hasNextLine()){
            line = scanner.nextLine();
            if(line.length() == 0){

                if(blankReturn) return line;
                else continue;
            }

            if(line.length() < 1 || line.length() > limit){
                System.out.print("输入长度（不大于"+limit+")错误，请重新输入:");
                continue;
            }
            break;
        }
        return line;
    }


}
